/**
 * Founder
 * KentStatementController.java
 */
package com.iori.common.db;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.torque.TorqueException;

import com.iori.common.db.dbctrl.DataAccessor;
import com.iori.common.db.dbctrl.StatementController;

/**
 * [クラス名]<br>
 *　DML文発行専用クラス<br><br>
 * [機能概要]<br>
 *　DataAccessorを保持し、１トランザクションで全て実行するクラス。<br><br>
 * [変更履歴]<br>
 *　2005/07/09 ver1.00 新規作成 zhanjc<br>
 *
 * @author zhanjc
 * @version 1.00
 */
public class TranStatementController extends StatementController {
	/**
	 * ログ出力用。
	 */
	protected static Log logger = LogFactory.getLog(TranStatementController.class);

	/**
	 * 	コンストラクタ。
	 */
	public TranStatementController() {
		super();
	}

	/**
	 * 	引数のDataAccessorをdataAccessorListに登録する。
	 *
	 * @param da DataAccessor
	 */
	public TranStatementController(DataAccessor da) {
		super(da);
	}

	/**
	 * addメソッドで登録されたDataAccessorを１トランザクションで実行する。<br>
	 * エラーになった場合は、ロールバックし、クローズ処理を行う。<br>
	 * 正常に終了するとゼロを返す。<br>
	 * ゼロ以外が返されたときは、エラー処理後にSessionExceptionをスローする。
	 *
	 * @return int 正常のとき0。
	 *
	 */
	public int execute()  throws SQLException{
		int errorCode = 0;
		try {
			super.run();
		} catch (SQLException sqle) {
			errorCode = sqle.getErrorCode();
			logger.error(sqle.getMessage());
			throw sqle;
		}
		return errorCode;
	}

	/**
	 * DB Transactionを開始する。手動的な終わらなければならない。
	 *
	 * @param schemaName
	 *
	 * @return Connectionのインスタンス
	 */
	public static Connection beginTransaction(String schemaName) throws Exception {
		Connection conn = null;

		try {
			DataAccessor da = DataAccessorFactory.getDataAccessor("", schemaName);
			conn = DbUtil.begin(da.getDestination());
			conn = da.setSchemaForConnection(conn);
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw e;
		}
		return conn;
	}

	/**
	 * DB Transactionを開始する。手動的な終わらなければならない。
	 *
	 * @return Connectionのインスタンス
	 */
	public static Connection beginTransaction() throws Exception {
		Connection conn = null;

		try {
			DataAccessor da = DataAccessorFactory.getDataAccessor("");
			conn = DbUtil.begin(da.getDestination());
			conn = da.setSchemaForConnection(conn);
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw e;
		}
		return conn;
	}

	/**
	 * DB Transactionを開始する。手動的な終わらなければならない。
	 *
	 * @param databaseName databaseのname
	 *
	 * @return Connectionのインスタンス
	 */
	public static Connection beginTransactionEx(String databaseName) throws Exception {
		Connection conn = null;

		try {
			DataAccessor da = DataAccessorFactory.getDataAccessorEx("" , databaseName);
			conn = DbUtil.begin(da.getDestination());
			conn = da.setSchemaForConnection(conn);
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw e;
		}
		return conn;
	}

	/**
	 * DB Transactionを手動的な終わる。
	 *
	 * @param conn
	 * @param bcommit		true:commit, false:rollback
	 */
	public static void endTransaction(Connection conn, boolean bcommit) throws  SQLException, TorqueException {
		try {
			if (conn != null) {
				if (bcommit) {
					DbUtil.commit(conn);
				} else {
					DbUtil.safeRollback(conn);
				}
			}
		} catch (TorqueException e) {
			logger.error(e.getMessage());
			DbUtil.safeRollback(conn);
			throw e;
		} catch (SQLException ex) {
			logger.error(ex.getMessage());
			DbUtil.safeRollback(conn);
			throw ex;
		}
	}
}
